package com.feiyisys.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;

/**
 * <p>
 * 文化活动表
 * </p>
 *
 * @author
 * @since
 */
@Getter
@Setter
public class Activity implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 活动ID，主键自增
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 活动标题
     */
    private String title;

    /**
     * 活动封面图片URL
     */
    private String coverImage;

    /**
     * 活动内容
     */
    private String content;

    /**
     * 活动开始时间
     */
    private Date startTime;

    /**
     * 活动结束时间
     */
    private Date endTime;

    /**
     * 活动地点
     */
    @TableField("address")
    private String location;

    /**
     * 活动配额（最大参与人数）
     */
    @TableField("max_participants")
    private Integer quota;

    /**
     * 当前报名人数
     */
    private Integer currentParticipants;

    /**
     * 状态：0-下架（不展示），1-报名中（可报名）,2-审核中（不可报名）, 3-已结束（不可报名）
     */
    private Byte status;

    /**
     * 活动创建时间
     */
    private Date createTime;

    /**
     * 活动信息最后更新时间
     */
    private Date updateTime;

    /**
     * 活动创建人（管理员）ID
     */
    @TableField("creator_id")
    private Long creatorId;

    /**
     * 判断活动是否过期
     * @return 如果当前时间超过活动结束时间，则返回true
     */
    public boolean isExpired() {
        return this.endTime != null && new Date().after(this.endTime);
    }

    /**
     * 判断活动是否可报名
     * @return 如果活动未过期且未达到配额且状态为报名中，则返回true
     */
    public boolean canRegister() {
        // 检查活动是否过期
        if (isExpired()) {
            return false;
        }

        // 检查活动状态
        if (this.status != 1) { // 1表示报名中
            return false;
        }

        // 检查是否达到配额
        if (this.quota != null && this.currentParticipants != null &&
                this.currentParticipants >= this.quota) {
            return false;
        }

        return true;
    }

}
